#ifndef __MYSTRING_H__
#define __MYSTRING_H__

#include <ostream>
#include <cstring> // strcpy strlen
using namespace std;

class String
{
public:
    String(const char* cstr = 0); // 构造函数
    String(const String& str); // 拷贝构造
    String& operator = (const String& str); // 拷贝赋值
    ~String(); // 析构
    char* get_c_str() const { return m_data; } ;
private:
    char* m_data;
};
 
inline
String::String(const char* cstr)
{
    if(cstr) {
        m_data = new char[strlen(cstr) + 1];
        strcpy(m_data, cstr);
    } 
    else {
        m_data = new char[1];
        *m_data = '\0';
    }
}

inline
String::~String()
{
    delete [] m_data;
}

inline
String::String(const String& str)
{
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.m_data);
}

inline
String& String::operator = (const String& str)
{
    // 自赋值检查
    if(this == &str)
        return *this;

    delete [] m_data;
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.m_data);
    return *this;
}

inline 
ostream& operator << (ostream& out, const String& str)
{
    return out << str.get_c_str();
}

#endif // __MYSTRING_H__
